package com.study.rabbitmq2.basic1;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.study.rabbitmq2.util.ConnectionUtil;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Author chenyeqing
 * @Date 2021/11/20 20:16
 */
public class Send {

    private final static String QUEUE_NAME = "simple_queue";

    public static void main(String[] args) {
        // 1、获取连接
        Connection connection = ConnectionUtil.getConnection();
        // 声明变量
        Channel channel = null;
        try {
            // 2、从连接中创建通道，使用通道才能完成消息相关的操作
            channel = connection.createChannel();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 3、声明队列
        try {
            /**
             * 参数明细
             * 1、queue：队列名称
             * 2、durable： 是否持久化，如果持久化，MQ重启后队列还在
             * 3、exclusive： 是否独占连接，队列只允许在该连接中访问，如果connection连接关闭队列则自动删除，
             *      如果将此参数设置为 true，可用于临时队列的创建
             * 4、autoDelete： 自动删除，队列不再使用时是否自动删除此队列，
             *      如果将此参数和 exclusive 参数设置为true就可以实现临时队列（队列不用了就自动删除）
             * 5、arguments： 参数，可以设置一个队列的扩展参数，比如：可设置存活时间
             *
             */
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 4、消息内容
        String message = "Hello World!";

        try {
            // 5、向指定的队列中发送消息
            /**
             * 参数明细
             * 1、exchange：交换机，如果不指定将使用MQ的默认交换机
             * 2、routingKey：路由key，交换机根据路由key来将消息转发到指定的队列。
             *      如果使用默认交换机，routingKey设置为队列的名称
             * 3、props：消息的属性
             * 4、body：消息内容
             */
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("[x] sent '" + message + "'");

        try {
            channel.close();
            connection.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }
}
